#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include "mycircularQueue.hpp"

using std::cout;
using std::endl;

void *consumer(void *args)
{
    circularQueue<int> *cq = static_cast<circularQueue<int> *>(args);

    //error: 是一个循环 -- 你的消费者只执行一次的吗？
    //error P,V操作是循环队列该操心的事情你做什么呢？

    // 1.先申请数据资源
    int data = 0;
    cq->P_Data(&data);
    // 2.对数据资源进行处理
    cout << "consumer get data: " << data << endl;

    // 3.使用完后，产生了一个空间资源
    cq->V_Room();
    return nullptr;
}

void *producer(void *args)
{
    circularQueue<int> *cq = static_cast<circularQueue<int> *>(args);
    //error: 是一个循环 -- 你的消费者只执行一次的吗？


    // 1.先申请空间资源
    int data = rand() % 20;
    cq->P_Room(data);
    // 2.将数据放入缓冲区
    // TODO 是怎么索引放入的，还未想明白

    // 3.生产完后，会产生一个数据资源
    cq->V_Data();
    return nullptr;
}

int main()
{
    circularQueue<int> *cq = new circularQueue<int>();
    // 让同一份资源被多线程看到 --> 传参
    pthread_t c, p;
    pthread_create(&c, nullptr, consumer, cq);
    pthread_create(&p, nullptr, producer, cq);

    pthread_join(c, nullptr);
    pthread_join(p, nullptr);

    return 0;
}